بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

به دست آوردن مقدار آرایه از فایل استرینگ و ریختن آن در یک متغیر استاتیک در یک non-activity class

مدیریت گفتگو
زهرا رئیسی 9 سال پیش
آخرین تغییر: 9 سال پیش

همان طور که از عنوان سوال پیداست من یک آرایه دارم که در فایل استرینگ تعریف شده و قصد دارم در یک متغیر استاتیک بریزم مثل زیر

  private static String[] array1=  getResources().getStringArray(R.array.arrayName);
 
 

اولا چون از یک کلاس non-activity دارم اصلا متد getResource رو نمیشناسه و از طرف دیگه حتی اگه کلاس من از نوع اکتیویتی باشه هم نمیشه مقدار را در یک  متغیر استاتیک ریخت  ممنون میشم اگه  کسی میدونه راهنماییم کنه

نظرات

amirhossein1376 9 سال پیش
متغیرهای استاتیک رو در حالتی که قراره از یک ویژگی کلاس استفاده کنیم نمیشه inline مقدار دهی کرد . توی onCreate اکتیوتی مقدار دهی انجام بدید مشکلی پیش نمیاد
Criss 9 سال پیش
میتونید از G.context استفاده کنید و یا یک Instance از activity بگیرید و یا به اون کلاس یک Activity پاس بدید

پاسخ‌ها 5

Reza 9 سال پیش

سلام ، به این شکل استفاده کنید :

آیتم تعریف شده در فایل Strings ( یا همون آرایه String ها ) :

<string-array name="force_unit">
<item>tonf</item>
<item>kgf</item>
<item>KN</item>
<item>N</item>
<item>tonf</item>
<item>kgf</item>
<item>KN</item>
<item>N</item>
<item>tonf</item>
<item>kgf</item>
<item>KN</item>
<item>N</item>
</string-array>

بعد id اون آیتم رو با استفاده نام آیتم بگیرید :

 int id_force = getResources().getIdentifier("force_unit", "array", getPackageName());

حالا این id در تابع getResources().getStringArray استفاده میشه :

 String[] force_Units = getResources().getStringArray(id_force);

نظرات

زهرا رئیسی 9 سال پیش
ممنون از جواباتون ولی من میخام تو کلاسی getResources() رو استفاده کنم که اصلا قرار نیست onCreate بشه و متد getResources رو نمیشناسه کسی راه حلی برا این موضوع داره
Reza 9 سال پیش
آهان ، من الان منظورتون رو گرفتم . طبق گفته JSONObject ، مقدار context رو به Constructor کلاس پاس بدید . دقیقا کار استاد . فقط یه سوال : کلاس extends شده از ImageView یه کلاس non-activity هست دیگه ، پس چرا من مشکلی با getResources ندارم و ایراد نمیگیره ؟!
زهرا رئیسی 9 سال پیش
البته نمیتونم با اطمینان بگم ولی وقتی شما کلاس را extends شده از ImageView قرار میدید یعنی به برنامه میگید context مربوط به imageview رو میخوام ولی کلاس من extend از چیزی نیست
Reza 9 سال پیش
بالاخره شما دارید از خارج این کلاس یکی از متدهای استاتیک کلاس رو صدا میزنید و یا از خارج اون یک شی از این کلاس می سازید . خب در هر دو حالت مشکلی نداره . اگه حالت اوله ، context اکتیویتی ( this ) یا اپلیکیشن ( getApplicationContext ) رو پاس بدید به متد استاتیک کلاس ، و اگه حالت دومه بازم یکی از همونا رو بدید به پارامتر شی ساخته شده از کلاس تا constructor اونو دریافت کنه .
Reza 9 سال پیش
البته مثل اینکه نوشتید کلا یک کلاس دارید !!! پس نمیشه .
Reza 9 سال پیش
ببخشید ، ولی فکر میکنم برنامه حداقل باید یک اکتیویتی داشته باشه . یا اگه اکتیویتی نداره و یک service هست خوب همون یک کلاس باید از Service مشتق بشه . اینکه فقط یک کلاس داشته باشیم و از هیچ چیز extends نشده باشه که اصلا برنامه اجرا نمیشه !
زهرا رئیسی 9 سال پیش
یه کلاسه که قراره تبدیل به فایل jar بشه اصلا قرار نیست اجرا بشه و چون یه سری نوشته فارسی داره که بعد از تبدیل به فایل jar بهم میریزه باید تو فایل استرینگ تعریف بشه
JSONObject 9 سال پیش
: من این کامنت آخرتون رو بعد از این که اون جواب رو گذاشتم خوندم، اگه اینطوره خب تنها راهش همینه که کانتکس رو از اپی بگیرین که قراره این فایل jar توش استفاده بشه ، یعنی همون جواب قبل ، که کانتکست تو کانستراکتور پاس داده میشد
JSONObject 9 سال پیش

به این صورت فک میکنم حل شه

 

 public class MyClass{

private Context mContext;
private static String[] array1;

public MyClass(Context context){
mContext = context;
array1 = context.getResources().getStringArray(R.array.array_name);
}

}

 

نظرات

زهرا رئیسی 9 سال پیش
خب من تیک حل شده هم زدم چون این کد لااقل در محیط کد نویسی ارور نمیده ولی متاسفانه تو اجرا null بر میگردونه ضمننا دوستان گفتن از کلاس G استفاده کنم من فقط یک کلاس دارم که از چیزی اکستندز نشده و نمیختم از کلاس دیگه ای استفاده کنم راه حلی داره به نظرتون
JSONObject 9 سال پیش
پس به جای context بنویس ()getApplicationContext
زهرا رئیسی 9 سال پیش
getApplicationContext() رو اصلا نمیشناسه چون کلاس اکستندز از چیزی نیست
Reza 9 سال پیش
نظرم رو باید اینجا میذاشتم ولی اشتباه شد . در پاسخ بالاتر قرار گرفت .
JSONObject 9 سال پیش
تو کامنت اول گفتین من فقط یک کلاس دارم که از چیزی اکستندز نشده اما قطعا فقط همین یک کلاس رو ندارین ، G رو هماگر ندارین خب بسازین : پاسخی که الان گذاشتم رو هم ببینید - چیزیه که بچه ها میگن
حمید 9 سال پیش

private static String[] array1= G.currentActivity.getResources().getStringArray(R.array.arrayName);

این که چه جوری از currentActivity استفاده کنید  در آموزشهای استاد موجوده.

نظرات

Reza 9 سال پیش

این جواب میده :

 String[] array = Resources.getSystem().getStringArray(R.array.array_name);

نظرات

JSONObject 9 سال پیش

واقعا غیر از این ها راه حل دیگری اصلا منطقی نیست که باشه :

یک : پاسخ قبلی 

دو : چیزی که اکثر بچه ها گفتن


//ایجاد کانتکس استاتیک در کلاس اپلیکیشن

 public class G extends Application{

public static Context context;

@Override
public void onCreate(){
super.onCreate();
context = this;
}

}
// و استفاده از اون در کلاس مورد نظرتون
public class MyClass{

private String[] array1;

public myClass(){
array1 = G.context.getResources().getStringArray(R.string.string_name);
//البته میشه حتی تا گت ریسورس هم استاتیک باشه ولی احتمالا اپتیمایز نیست
}

}

// والبته کلاس جی در مانیفست
<application
android:name=".G"
...
 

 

 

 

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .